home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CICA 1993 April
/
CICA MS Windows - April 1993.iso
/
unzipped
/
util
/
wnkerm23
/
src
/
wktint.c
< prev
next >
Wrap
C/C++ Source or Header
|
1991-10-25
|
17KB
|
570 lines
/*
* Initialization segment for the Windows Win100 emulator.
* This code is discarded after it is used.
*
* Copyright (c) 1990, 1991 by
* William S. Hall
* 3665 Benton Street, #66
* Santa Clara, CA 95051
*
* $Date$
* $Revision$
* $RCSfile$
* $Source$
* $State$
*/
#define NOKANJI
#define NOMINMAX
#define NOSOUND
#include <windows.h>
#include <stdlib.h>
#include <limits.h>
#include <ascii.h>
#include <string.h>
#ifdef COLUMBIA
#include "wktsmt.h"
#else
#include "smterm.h"
#endif
#ifdef WIN600
#include "grterm.h"
#endif
#ifdef COLUMBIA
#include "wkt100.h"
#else
#include "win600.h"
#endif
static char *szInitKeyStr;
static int Initlen;
static BOOL WinIniModified = FALSE;
#define INITKEYSIZE 1024
/* local function declarations */
static BOOL NEAR RegisterWindowClass(HANDLE);
static void NEAR GetCurrentInstanceData(HANDLE hInstance);
static void NEAR GetPrevInstanceData(HANDLE);
static BOOL NEAR MakeAndShowMainWnd(HANDLE, HANDLE, int);
static BOOL NEAR ReadInitialData(HANDLE hInstance);
static BOOL NEAR OpenAndSetCommPort(HANDLE hInstance);
static BOOL NEAR SearchKey(char *str, char *key, int len);
static int NEAR GetInitData(int id, int defval);
/* This routine is FAR since it is called from another segment */
BOOL FAR InitProgram(hInstance,hPrevInstance, lpszCmdLine, cmdShow)
HANDLE hInstance, hPrevInstance;
LPSTR lpszCmdLine;
int cmdShow;
{
/*** GET COMMAND LINE ? ***/
hInst = hInstance;
DoMessage = DoPeekMessage;
/* if this is the first instance of the program ... */
if (!hPrevInstance) {
GetCurrentInstanceData(hInstance);
if (!RegisterWindowClass(hInstance))
return FALSE;
hAccel = LoadAccelerators(hInstance, (LPSTR)szAppName);
}
/* A previous instance already exists so get global data from there */
else
GetPrevInstanceData(hPrevInstance);
if (!ReadInitialData(hInstance))
return FALSE;
/* Create and show the window */
if (!MakeAndShowMainWnd(hInstance,hPrevInstance, cmdShow))
return FALSE;
hWndText = MakeAndShowTermWindow(hInstance,
hPrevInstance,
MWnd.hWnd,
&Smt,
ColorTable[Initdata.TextColor],
ColorTable[Initdata.BGColor],
0,0,
Initdata.TermRows,
Initdata.TermCols,
Initdata.Wrap,
Initdata.Fontface,
Initdata.NFontWidth,
Initdata.NFontHeight,
Initdata.SFontWidth,
Initdata.SFontHeight);
if (hWndText == 0)
PostMessage(MWnd.hWnd, WM_SYSCOMMAND, SC_CLOSE, 0L);
#ifdef WIN600
if (!MakeAndShowGraphWindow(hInstance,
hPrevInstance,
MWnd.hWnd,
&Grt,
ColorTable[Initdata.TextColor],
ColorTable[Initdata.BGColor],
0,0,
1024,800
))
PostMessage(MWnd.hWnd, WM_SYSCOMMAND, SC_CLOSE, 0L);
#endif
hWndNext = SetClipboardViewer(MWnd.hWnd);
curproto.type = 'A';
if (Initdata.EWidth == 7)
curproto.mask = 0x7f;
else
curproto.mask = 0xff;
hWndActive = hWndText;
SetAlphaParams(Initdata.AlphaEmulation);
LocalEcho = Initdata.LocalEcho;
if (Initdata.LocalMode) {
LineState = LOCAL_ON;
DoMessage = DoGetMessage;
} else {
LineState = LINE_ON + LocalEcho;
DoMessage = DoPeekMessage;
}
if (Initdata.ReverseVideo) {
InvertScreen(TRUE);
MWnd.Reverse = TRUE;
}
cid = INT_MIN;
if (!OpenAndSetCommPort(hInstance))
PostMessage(MWnd.hWnd, WM_SYSCOMMAND, SC_CLOSE, 0L);
else {
MWnd.Cursor = Initdata.Cursor ? TRUE : FALSE;
MWnd.CursorType = Initdata.CursorType ? TRUE : FALSE;
MWnd.BreakEnabled = Initdata.BreakEnabled ? TRUE : FALSE;
MWnd.CurKeyMode = Initdata.CursorKeys ? TRUE : FALSE;
MWnd.DeleteKey = Initdata.DeleteKey ? TRUE : FALSE;
MWnd.AutoAnswer = Initdata.AutoAnswer ? TRUE : FALSE;
MWnd.LFCR = Initdata.LFCR ? TRUE : FALSE;
MWnd.ApplMode = Initdata.AltKeypad ? TRUE : FALSE;
MWnd.WarningBell = Initdata.WarningBell ? TRUE : FALSE;
MWnd.Wrap = Initdata.Wrap;
MWnd.ControlRep = Initdata.ControlRep;
if (MWnd.ControlRep) {
if (curproto.atype == 52)
vt52SetState(-1);
else
vt100SetState(-1);
SendMessage(hWndActive, SMT_SETATTRIBUTE, SM_AUTOWRAP, (LONG)TRUE);
}
SendMessage(hWndText,SMT_SETATTRIBUTE,SM_MARGINBELL,
(LONG)Initdata.MarginBell);
SendMessage(hWndText,SMT_SETATTRIBUTE,SM_SMOOTHSCROLL,
(LONG)Initdata.SmoothScroll);
SendMessage(hWndText,SMT_SETATTRIBUTE,SM_SCROLLUNITS,
(LONG)Initdata.ScrollUnits);
/* finally, display the window and show success */
ShowWindow(MWnd.hWnd, cmdShow);
UpdateWindow(MWnd.hWnd);
}
return TRUE;
}
void FAR MainWndCreate(HWND hWnd, LONG lParam)
{
MWnd.TextColor = Initdata.TextColor;
MWnd.BGColor = Initdata.BGColor;
MWnd.hBrush = CreateSolidBrush(ColorTable[Initdata.BGColor]);
}
static BOOL NEAR SearchKey(char *str, char *key, int len)
{
int i;
char *startptr;
startptr = str;
for (i = 0; i < len; i++) {
if (*str++)
;
else {
if (strcmp(key, startptr) == 0)
return(TRUE);
startptr = str;
}
}
return (FALSE);
}
static BOOL NEAR ReadInitialData(HANDLE hInstance)
{
char szKeyStr[80];
char szDefStr[80];
HANDLE hInitKeyStr;
register int i, val;
HDC hIC;
int cwidth, cheight;
HFONT hOldFont;
TEXTMETRIC tm;
GetModuleFileName(hInstance, szHelpName, sizeof(szHelpName));
lstrcpy(szIniName, szHelpName);
lstrcpy(szHelpName + strlen(szHelpName) - 3, "HLP");
lstrcpy(szIniName + strlen(szIniName) - 3, "INI");
hIC = CreateIC("DISPLAY", NULL, NULL, NULL);
MWnd.PelSize = GetDeviceCaps(hIC,BITSPIXEL) * GetDeviceCaps(hIC,PLANES);
hOldFont = SelectObject(hIC, GetStockObject(SYSTEM_FIXED_FONT));
GetTextMetrics(hIC, &tm);
cwidth = tm.tmAveCharWidth;
cheight = tm.tmHeight + tm.tmExternalLeading;
SelectObject(hIC, hOldFont);
DeleteDC(hIC);
hInitKeyStr = LocalAlloc(LPTR, INITKEYSIZE);
if ((szInitKeyStr = LocalLock(hInitKeyStr)) == NULL)
return FALSE;
Initlen = GetPrivateProfileString(szAppName, NULL, "", szInitKeyStr,
INITKEYSIZE, szIniName);
/* default ports */
for (i = 0; i < MAXCOMPORTS; i++) {
LoadString(hInstance,IDS_FIRSTPORT+i,(LPSTR)szKeyStr,sizeof(szKeyStr));
LoadString(hInstance,IDS_COM1 + i, (LPSTR)szDefStr, sizeof(szDefStr));
if (!SearchKey(szInitKeyStr, szKeyStr, Initlen)) {
WinIniModified = TRUE;
WritePrivateProfileString(szAppName,szKeyStr,szDefStr, szIniName);
}
GetPrivateProfileString(szAppName,szKeyStr,szDefStr,
Initdata.portname[i],
sizeof(Initdata.portname[i]), szIniName);
}
/* comm parameters */
Initdata.BaudRate = (WORD)GetInitData(IDS_BAUD, DEFBAUD);
for (i = 0; i < BAUDRATETABLESIZE; i++)
if (BaudRateTable[i] == Initdata.BaudRate)
break;
if (i == BAUDRATETABLESIZE)
Initdata.BaudRate = DEFBAUD;
Initdata.Parity = (BYTE)GetInitData(IDS_PARITY, DEFPARITY);
Initdata.ByteSize = (BYTE)GetInitData(IDS_BYTESIZE, DEFBYTESIZE);
for (i = 0; i < PARITYTABLESIZE; i++)
if ((ParityTable[i].Parity == Initdata.Parity) &&
(ParityTable[i].ByteSize == Initdata.ByteSize))
break;
if (i == PARITYTABLESIZE) {
Initdata.ByteSize = DEFBYTESIZE;
Initdata.Parity = DEFPARITY;
}
Initdata.StopBits = (BYTE)GetInitData(IDS_STOPBITS, DEFSTOP);
Initdata.fParity = (BYTE)GetInitData(IDS_PARCHECK, DEFPECHECK);
Initdata.XonXoff = (BYTE)GetInitData(IDS_XONXOFF, DEFXONXOFF);
Initdata.XoffLim = (WORD)GetInitData(IDS_XOFFLIM, DEFXOFFLIM);
for (i = 0; i < XOFFLIMSIZE; i++)
if (XoffSizeTable[i] == Initdata.XoffLim)
break;
if (i == XOFFLIMSIZE)
Initdata.XoffLim = DEFXOFFLIM;
Initdata.LocalEcho = GetInitData(IDS_LOCALECHO, DEFLOCALECHO) ? 1 : 0;
Initdata.Wrap = GetInitData(IDS_WRAP, DEFWRAP) ? TRUE : FALSE;
Initdata.LFCR = GetInitData(IDS_AUTOLFCR, DEFLFCR) ? TRUE : FALSE;
Initdata.MarginBell = GetInitData(IDS_MARGINBELL, DEFMBELL) ? TRUE : FALSE;
Initdata.ControlRep =
GetInitData(IDS_CONTROLREP, DEFCONTROLREP) ? TRUE : FALSE;
Initdata.Cursor = GetInitData(IDS_CURSOR, DEFCURSOR) ? TRUE : FALSE;
Initdata.CursorType =
GetInitData(IDS_CURSORTYPE, DEFCURSORTYPE) ? TRUE : FALSE;
val = COLORTABLESIZE - 1;
Initdata.BGColor = GetInitData(IDS_BGCOLOR, DEFBGCOLOR) & val;
Initdata.TextColor = GetInitData(IDS_TEXTCOLOR, DEFTEXTCOLOR) & val;
if (MWnd.PelSize == 1) {
if (Initdata.BGColor) {
Initdata.BGColor = val;
Initdata.TextColor = 0;
} else {
Initdata.TextColor = val;
Initdata.BGColor = 0;
}
} else {
if (Initdata.TextColor == Initdata.BGColor)
Initdata.TextColor = (~Initdata.BGColor) & val;
}
Initdata.WarningBell =
GetInitData(IDS_WARNINGBELL, DEFWBELL) ? TRUE : FALSE;
val = GetInitData(IDS_TERMTYPE, DEFTERMTYPE);
Initdata.AlphaEmulation =
((val == 52) || (val == 100)) ? val : DEFTERMTYPE;
val = GetInitData(IDS_EMULATIONWIDTH, DEFEWIDTH);
Initdata.EWidth = ((val == 7) || (val == 8)) ? val : DEFEWIDTH;
if (Initdata.AlphaEmulation == 52)
Initdata.EWidth = 7;
Initdata.ReverseVideo =
GetInitData(IDS_REVERSEVIDEO, DEFVIDEO) ? TRUE : FALSE;
Initdata.SmoothScroll =
GetInitData(IDS_SMOOTHSCROLL, DEFSCROLL) ? TRUE : FALSE;
val = GetInitData(IDS_SCROLLUNITS, DEFSCROLLUNITS);
Initdata.ScrollUnits =
((val >= 0) && (val <= MAXSCROLLUNITS)) ? val : DEFSCROLLUNITS;
Initdata.LocalMode =
GetInitData(IDS_LOCALMODE, DEFLOCALMODE) ? TRUE : FALSE;
Initdata.AltKeypad =
GetInitData(IDS_ALTKEYPAD, DEFALTKEYPAD) ? TRUE : FALSE;
Initdata.CursorKeys =
GetInitData(IDS_CURSORKEYS, DEFCURSORKEYS) ? TRUE : FALSE;
Initdata.BreakEnabled =
GetInitData(IDS_BREAKKEYENABLED, DEFBREAKENABLED) ? TRUE : FALSE;
Initdata.DeleteKey =
GetInitData(IDS_DELETEKEY, DEFDELETEKEY) ? TRUE : FALSE;
Initdata.AutoAnswer =
GetInitData(IDS_AUTOANSWER, DEFAUTOANSWER) ? TRUE : FALSE;
val = GetInitData(IDS_ROWS, DEFROWS);
Initdata.TermRows = ((val >= 2) && (val <= MAXROWS)) ? val : DEFROWS;
val = GetInitData(IDS_COLS, DEFCOLS);
Initdata.TermCols = val > 80 ? 132 : 80;
LoadString(hInstance, IDS_FONTFACE, (LPSTR)szKeyStr,sizeof(szKeyStr));
LoadString(hInstance, IDS_DEFAULTFONT, szDefStr, sizeof(szDefStr));
if (!SearchKey(szInitKeyStr, szKeyStr, Initlen)) {
WinIniModified = TRUE;
WritePrivateProfileString(szAppName, szKeyStr, szDefStr, szIniName);
}
GetPrivateProfileString(szAppName, szKeyStr, szDefStr, Initdata.Fontface,
sizeof(Initdata.Fontface), szIniName);
Initdata.NFontWidth = GetInitData(IDS_NORMALWIDTH, cwidth);
if (Initdata.NFontWidth == 0)
Initdata.NFontWidth = cwidth;
Initdata.NFontHeight = GetInitData(IDS_NORMALHEIGHT, cheight);
if (Initdata.NFontHeight == 0)
Initdata.NFontHeight = cheight;
Initdata.SFontWidth = GetInitData(IDS_SMALLWIDTH, cwidth);
if (Initdata.SFontWidth == 0)
Initdata.SFontWidth = cwidth;
Initdata.SFontHeight = GetInitData(IDS_SMALLHEIGHT, cheight);
if (Initdata.SFontHeight == 0)
Initdata.SFontHeight = cheight;
LocalUnlock(hInitKeyStr);
LocalFree(hInitKeyStr);
if (WinIniModified)
BroadcastWinIniChange();
return TRUE;
}
static int NEAR GetInitData(int id, int defval)
{
char szKeyStr[80];
char buf[40];
LoadString(hInst, id, szKeyStr,sizeof(szKeyStr));
if (!SearchKey(szInitKeyStr, szKeyStr, Initlen)) {
WinIniModified = TRUE;
WritePrivateProfileString(szAppName,szKeyStr,
itoa(defval, buf, 10), szIniName);
}
return GetPrivateProfileInt(szAppName, szKeyStr, defval, szIniName);
}
static BOOL NEAR OpenAndSetCommPort(HANDLE hInstance)
{
int i, reply;
char szMessage[80];
char szBigMsg[160];
for (i = 0; i < MAXCOMPORTS; i++) {
if ((cid = OpenComm(Initdata.portname[i], DEFRXQUE, DEFTXQUE)) < 0) {
LoadString(hInstance,cid,szBigMsg,sizeof(szMessage));
LoadString(hInstance,IDS_TRYANOTHER,szMessage,sizeof(szMessage));
strcat(szBigMsg, szMessage);
reply = MessageBox(MWnd.hWnd,(LPSTR)szBigMsg,
(LPSTR)Initdata.portname[i], MB_ICONQUESTION | MB_YESNO);
if (reply == IDNO)
return FALSE;
}
else
break;
}
if (i == MAXCOMPORTS) {
// LoadString(hInstance, IDS_NOCOM, szMessage, sizeof(szMessage));
ShowMessage(MWnd.hWnd, IDS_NOCOM, MB_ICONEXCLAMATION | MB_OK);
return FALSE;
}
LoadString(hInstance, IDS_TITLE, szMessage, sizeof(szMessage));
strcat(szMessage, Initdata.portname[i]);
SetWindowText(MWnd.hWnd, szMessage);
if ((reply = GetCommState(cid, (DCB FAR *)&CommData)) >= 0) {
CommData.BaudRate = Initdata.BaudRate;
CommData.ByteSize = Initdata.ByteSize;
CommData.Parity = Initdata.Parity;
CommData.StopBits =
(BYTE)(Initdata.StopBits == 2 ? TWOSTOPBITS : ONESTOPBIT);
CommData.fParity = (BYTE)(Initdata.fParity ? 1 : 0);
CommData.fPeChar = CommData.fParity;
CommData.PeChar = DEFPECHAR;
CommData.fOutX = CommData.fInX =
(BYTE)(Initdata.XonXoff ? TRUE : FALSE);
CommData.XonChar = DEFXONCHAR;
CommData.XoffChar = DEFXOFFCHAR;
CommData.XonLim = DEFXONLIM;
CommData.XoffLim = DEFRXQUE - Initdata.XoffLim;
CommData.fBinary = TRUE;
CommData.fDtrDisable = FALSE;
CommData.fNull = TRUE;
if ((reply = SetCommState((DCB FAR *)&CommData)) >= 0)
return TRUE;
}
ShowMessage(MWnd.hWnd, reply, MB_OK | MB_ICONEXCLAMATION);
CloseCommPort(MWnd.hWnd, &cid);
return FALSE;
}
static void NEAR GetCurrentInstanceData(HANDLE hInstance)
{
LoadString(hInstance, IDS_ICON, (LPSTR)szIcon, sizeof(szIcon));
}
/*
If this not the first instance, we can retrieve static data from a
previous invocation of the program
*/
static void NEAR GetPrevInstanceData(HANDLE hPrevInstance)
{
GetInstanceData(hPrevInstance, (PSTR)szAppName, sizeof(szAppName));
GetInstanceData(hPrevInstance, (PSTR)szIcon, sizeof(szIcon));
GetInstanceData(hPrevInstance, (PSTR)&hAccel, sizeof(hAccel));
}
/* Every window must belong to a class. We register ours here */
static BOOL NEAR RegisterWindowClass(HANDLE hInstance)
{
PWNDCLASS pWndClass;
HANDLE hTemp;
/* Load the name string from resources */
LoadString(hInstance, IDS_APPNAME,(LPSTR)szAppName,sizeof(szAppName));
/* allocate space for the WNDCLASS structure and lock it down */
hTemp = LocalAlloc(LPTR,sizeof(WNDCLASS));
pWndClass = (PWNDCLASS)LocalLock(hTemp);
/* fill the structure */
pWndClass->hCursor = LoadCursor(NULL, IDC_ARROW); /* standard cursor */
pWndClass->hIcon = NULL; /* no icon */
pWndClass->lpszMenuName = (LPSTR)szAppName;
pWndClass->lpszClassName = (LPSTR)szAppName; /* our class name */
pWndClass->hbrBackground = (HBRUSH)NULL;
pWndClass->hInstance = hInstance; /* instance handle */
pWndClass->style = CS_VREDRAW | CS_HREDRAW; /* standard redraw values */
pWndClass->lpfnWndProc = MainWndProc; /* pointer to our window proc */
pWndClass->cbClsExtra = 0;
pWndClass->cbWndExtra = sizeof(pMWND);
/* register the class. if fail, abort */
if (!RegisterClass((LPWNDCLASS)pWndClass))
return FALSE;
/* free the memory used */
LocalUnlock(hTemp);
LocalFree(hTemp);
/* show success */
return TRUE;
}
/*
Create the window, making sure that its position and size are suitable
for the display.
*/
static BOOL NEAR MakeAndShowMainWnd(HANDLE hInstance, HANDLE hPrevInstance,
int cmdShow)
{
char szTitle[50];
DWORD style = WS_HSCROLL | WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN;
int x, y, cx, cy;
int cwidth, cheight;
LoadString(hInstance, IDS_TITLE,(LPSTR)szTitle,sizeof(szTitle));
if (hPrevInstance)
x = CW_USEDEFAULT;
else
x = 0;
y = GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYFRAME);
if (Initdata.TermCols == MAXCOLUMNS) {
cwidth = Initdata.SFontWidth;
cheight = Initdata.SFontHeight;
}
else {
cwidth = Initdata.NFontWidth;
cheight = Initdata.NFontHeight;
}
cx = Initdata.TermCols * cwidth + 2 * GetSystemMetrics(SM_CXFRAME);
cx = min(GetSystemMetrics(SM_CXSCREEN), cx);
cy = Initdata.TermRows * cheight + 2 * GetSystemMetrics(SM_CYFRAME) +
GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYMENU) +
GetSystemMetrics(SM_CYHSCROLL);
cy = min(GetSystemMetrics(SM_CYSCREEN) - y, cy);
if (MWnd.hWnd = CreateWindow((LPSTR)szAppName,
(LPSTR)szTitle,
style,
x, y, cx, cy,
(HWND)NULL,
(HMENU)NULL,
(HANDLE)hInstance,
(LPSTR)NULL))
return TRUE;
return FALSE;
}